package com.demo.java.OD651_700.OD653;

import java.util.Scanner;
import java.util.Arrays;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【数组限制数(A卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/147040045
 */
public class OdMain {
    public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);
        int nums = in.nextInt();  // 数组元素的个数
        int sum = in.nextInt();   // 数组和的最大限制
        int[] balls = new int[nums];  // 存储数组元素
        int[] org_balls = new int[nums];  // 存储原始数组数据，以便后续恢复

        // 读取数组元素
        for (int i = 0; i < nums; i++) {
            balls[i] = in.nextInt();
            org_balls[i] = balls[i];
        }

        // 计算数组的总和
        int total = Arrays.stream(balls).sum();

        // 如果原始数组和已经小于等于给定的总和，直接输出[]
        if (total <= sum) {
            System.out.println("[]");
            return;
        }

        // 对数组进行排序，以便二分查找最合适的M值
        Arrays.sort(balls);

        // 二分查找的初始化，确定范围
        int left = sum / nums;  // 最小限制值
        int right = balls[nums - 1];  // 最大限制值
        int[] result = new int[nums];  // 存储最终的调整结果

        // 通过二分查找来确定合适的M值
        for (int i = 0; i < nums; i++) {
            result[i] = org_balls[i] > left ? left : org_balls[i];  // 初始设置限制
        }

        // 二分查找过程
        while (right > left + 1) {
            int mid = (right + left) / 2;  // 计算中间值M

            int[] tmp = new int[nums];  // 临时数组用于存储当前M值下的调整结果
            int temp_total = 0;  // 临时存储调整后的总和

            // 对数组中的每个元素进行调整
            for (int i = 0; i < balls.length; i++) {
                int r = org_balls[i] > mid ? mid : org_balls[i];  // 不超过M的限制
                temp_total += r;  // 累加调整后的总和
                tmp[i] = r;  // 保存调整后的元素
            }

            // 根据总和与给定的sum值进行比较，调整二分查找的范围
            if (temp_total > sum) {
                right = mid;  // 总和过大，减小M
            } else if (temp_total < sum) {
                left = mid;  // 总和过小，增大M
                result = tmp;  // 保存当前的调整结果
            } else {
                result = tmp;  // 如果总和刚好等于sum，保存当前结果并退出
                break;
            }
        }

        // 排序调整后的结果并输出
        Arrays.sort(result);
        System.out.println(result[nums - 1]);  // 输出最终的最大值
    }
}